In [9]:
%pylab inline
#%numpy.linalg inline
%qtconsole
from mpl_toolkits.mplot3d import Axes3D
from ipywidgets import interact, interactive
from IPython.display import clear_output, display, HTML
Para esta primera parte, utilizaremos una biblioteca muy útil para cálculo matricial, numpy. De allí sacaremos los tipos de dato ndarray, matrix, y todas las operaciones que utilicemos. Veamos un poco cómo definir vectores fila, matrices, y cómo llamar a determinado componente de determinado vector o matriz.
In [5]:
pos = array([1,4,3])
mat = matrix([[1,2,3],
[4,5,6],
[7,8,9]])
x = pos[0] # en Python, las posiciones de los vectores comienzan a contarse en 0
y = pos[1]
z = pos[2]
print 'suma de las componentes:', x+y+z, sum(pos)
c = (mat[0,0] + mat[0,1])* mat[1,1]
print 'operación con los elementos de la matriz:' , c
#Nos acostumbraremos a utilizar arrays para matrices
mat = array(mat) # La función array() transforma mat (que era una matrix) en un ndarray
print mat, type(mat)
Las matrices especiales pueden armarse "a mano" como ejercicio, como también pueden buscarse entre las funciones que Python ofrece
In [6]:
identidad = zeros([3,3])
for i in range(3):
for j in range(3):
if i == j:
identidad[i,j] = 1
print 'identidad armada a mano: '
print identidad
identidad2 = identity(3)
print 'identidad de la función de Python: '
print identidad2
unos = ones([3,4]) #matriz de unos
print 'matriz de unos: '
print unos
ceros = zeros([4,3]) #matriz de ceros
print 'matriz de ceros: '
print ceros
Entre las operaciones que pueden hacerse con vectores y matrices se encuentran las que esperamos que estén: producto escalar, producto de matrices con vectores, transposición.
In [7]:
print 'teníamos la matriz: '
print mat
trans = transpose(mat)
print 'la traspuesta es: '
print trans
print 'vector pos=', pos
print 'producto escalar: ' , dot(pos, pos) # producto escalar entre vectores
print 'producto componente a componente:' , pos*pos # producto componente a componente. Más útil con funciones
A = array([[1,2],[0,1]]) #Otra forma de definir directamente matrices como arrays sin tener que transformar
x = array([1,2])
print 'A = ',A,' ', 'x= ', x
print 'Ax=', dot(A, x)
Y también tenemos esas funciones que siempre quisimos tener desde el CBC: inversa de una matriz, cálculo de determinantes, resolución de sistema de ecuaciones, hallazgo de autovalores y autovectores. Para esto usamos una biblioteca extra llamada linalg
In [12]:
print 'Podemos encontrar la matriz inversa: '
print inv(A)
print 'su determinante:', det(A)
print 'Resolver un sistema de forma Ax=b'
b = x
print 'x =' ,solve(A, b)
print 'Y hallar autovalores y autovectores'
autoval, autovec = eig(A)
print 'Los autovalores: ', autoval
print 'Los autovectores: ', autovec
Lo siguiente que Python tiene de interesante para usar son sus facilidades para hacer gráficos. La biblioteca "matplotlib" nos ayudará en este caso. Primero, definimos un vector que nos hace de dominio, luego, un vector imagen de alguna función, y luego haremos el gráfico. Se muestran aquí algunas de las opciones que tiene matplotlib para presentar un gráfico, pero yendo a la documentación podrán encontrar infinidad de herramientas para hacer esto.
In [44]:
# Ploteos
x = linspace(-10, 10, 200) # con la función linspace generaremos un vector con componentes equidistantes.
y = x**2 # el vector imagen será igual de largo que x
plot(x,y, '-', color = 'red', label = 'Curva x**2') # ver qué pasa con 'r', 'g', '*' entre otros
title('Mi primer ploteo')
xlabel('Eje de las x')
ylabel('Eje de las y')
#xlim(-5,5)
#ylim(0,4)
legend('best')
Out[44]:
In [38]:
f = lambda x,n: sin(n*pi*x) # Definimos una sucesión de funciones trigonométricas
y = f(x,0) # vector imagen de la función f(x) = 0
for i in range(5): # este es un caso simple donde sumo las 5 primeras funciones de la sucesión
y = y + f(x,i) # a esa y le sumo el valor de las imágenes de las siguientes funciones de la sucesión de funciones
plot(x,y, label = 'Curva')
title('Suma de senos')
xlabel('Dominio')
ylabel('Suma de los primeros 5 senos')
legend('best')
# Podríamos hacer derivación numérica
# Integración sería útil?
# Transformada de Fourier es irse al chori?
Out[38]:
Para más referencias pueden googlear. Dejamos algunas de referencia:
http://pybonacci.org/2012/06/07/algebra-lineal-en-python-con-numpy-i-operaciones-basicas/
http://relopezbriega.github.io/blog/2015/06/14/algebra-lineal-con-python/
http://pendientedemigracion.ucm.es/info/aocg/python/modulos_cientificos/numpy/index.html
Pero es importantísimo manejarse con la documentación de las bibliotecas que se utilizan
http://docs.scipy.org/doc/numpy/reference/routines.linalg.html
In [ ]: